home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / interpreter / context / MethodContext.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-14  |  11.0 KB  |  380 lines

  1. package koala.dynamicjava.interpreter.context;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.InvocationTargetException;
  6. import java.lang.reflect.Method;
  7. import java.util.LinkedList;
  8. import java.util.List;
  9. import java.util.Set;
  10. import koala.dynamicjava.classinfo.JavaClassInfo;
  11. import koala.dynamicjava.interpreter.Interpreter;
  12. import koala.dynamicjava.interpreter.InterpreterUtilities;
  13. import koala.dynamicjava.interpreter.NodeProperties;
  14. import koala.dynamicjava.interpreter.TreeCompiler;
  15. import koala.dynamicjava.interpreter.error.CatchedExceptionError;
  16. import koala.dynamicjava.interpreter.error.ExecutionError;
  17. import koala.dynamicjava.interpreter.throwable.ThrownException;
  18. import koala.dynamicjava.tree.ClassAllocation;
  19. import koala.dynamicjava.tree.ClassDeclaration;
  20. import koala.dynamicjava.tree.ConstructorDeclaration;
  21. import koala.dynamicjava.tree.ConstructorInvocation;
  22. import koala.dynamicjava.tree.Expression;
  23. import koala.dynamicjava.tree.FieldDeclaration;
  24. import koala.dynamicjava.tree.FormalParameter;
  25. import koala.dynamicjava.tree.Identifier;
  26. import koala.dynamicjava.tree.IdentifierToken;
  27. import koala.dynamicjava.tree.Node;
  28. import koala.dynamicjava.tree.ObjectFieldAccess;
  29. import koala.dynamicjava.tree.QualifiedName;
  30. import koala.dynamicjava.tree.ReferenceType;
  31. import koala.dynamicjava.tree.SimpleAllocation;
  32. import koala.dynamicjava.tree.SimpleAssignExpression;
  33. import koala.dynamicjava.tree.TreeUtilities;
  34. import koala.dynamicjava.tree.TypeDeclaration;
  35. import koala.dynamicjava.tree.TypeExpression;
  36. import koala.dynamicjava.util.ImportationManager;
  37. import koala.dynamicjava.util.ReflectionUtilities;
  38.  
  39. public class MethodContext extends StaticContext {
  40.    protected static final Identifier thisIdentifier = new Identifier("this");
  41.    // $FF: synthetic field
  42.    private static Class class$Ljava$util$Map;
  43.  
  44.    public Node getDefaultQualifier(Node var1, String var2) {
  45.       if (var2.equals("")) {
  46.          return this.defaultQualifier;
  47.       } else {
  48.          try {
  49.             Class var3 = ((StaticContext)this).lookupClass(var2);
  50.             Class var4 = this.declaringClass;
  51.  
  52.             for(Object var5 = this.defaultQualifier; var4 != null; var4 = InterpreterUtilities.getDeclaringClass(var4)) {
  53.                if (var4 == var3) {
  54.                   return (Node)var5;
  55.                }
  56.  
  57.                var5 = new ObjectFieldAccess((Expression)var5, this.getOuterThisName(var4));
  58.             }
  59.  
  60.             throw new ExecutionError("this.expression", var1);
  61.          } catch (ClassNotFoundException var6) {
  62.             throw new CatchedExceptionError(var6, var1);
  63.          }
  64.       }
  65.    }
  66.  
  67.    public Expression createName(Node var1, IdentifierToken var2) {
  68.       if (((VariableContext)this).isDefinedVariable(var2.image())) {
  69.          return super.createName(var1, var2);
  70.       } else {
  71.          Object var3 = null;
  72.  
  73.          try {
  74.             Field var11 = ReflectionUtilities.getField(this.declaringClass, var2.image());
  75.             return new ObjectFieldAccess((Expression)this.defaultQualifier, var2.image());
  76.          } catch (Exception var9) {
  77.             try {
  78.                Field var10 = InterpreterUtilities.getOuterField(this.declaringClass, var2.image());
  79.                Object var5 = (Expression)this.defaultQualifier;
  80.                Class var6 = this.declaringClass;
  81.  
  82.                for(Class var7 = var10.getDeclaringClass(); !var7.isAssignableFrom(var6); var6 = InterpreterUtilities.getDeclaringClass(var6)) {
  83.                   var5 = new ObjectFieldAccess((Expression)var5, this.getOuterThisName(var6));
  84.                }
  85.  
  86.                return new ObjectFieldAccess((Expression)var5, var2.image());
  87.             } catch (Exception var8) {
  88.                throw new CatchedExceptionError(var9, var1);
  89.             }
  90.          }
  91.       }
  92.    }
  93.  
  94.    public Object getHiddenArgument() {
  95.       return ((VariableContext)this).get("this");
  96.    }
  97.  
  98.    public Class setProperties(SimpleAllocation var1, Class var2, Class[] var3) {
  99.       Object var4 = null;
  100.  
  101.       try {
  102.          var11 = ((GlobalContext)this).lookupConstructor(var2, var3);
  103.       } catch (Exception var10) {
  104.          if (this.isInnerclass(var2, this.declaringClass)) {
  105.             Class[] var12 = new Class[var3.length + 1];
  106.             var12[0] = this.declaringClass;
  107.  
  108.             for(int var13 = 1; var13 < var12.length; ++var13) {
  109.                var12[var13] = var3[var13 - 1];
  110.             }
  111.  
  112.             try {
  113.                var11 = ((GlobalContext)this).lookupConstructor(var2, var12);
  114.             } catch (Exception var9) {
  115.                throw new CatchedExceptionError(var10, var1);
  116.             }
  117.  
  118.             var1.setProperty("innerAllocation", (Object)null);
  119.          } else {
  120.             if (var2.getDeclaringClass() == null || var2.getDeclaringClass() != this.declaringClass.getDeclaringClass()) {
  121.                throw new CatchedExceptionError(var10, var1);
  122.             }
  123.  
  124.             Class[] var6 = new Class[var3.length + 1];
  125.             var6[0] = this.declaringClass.getDeclaringClass();
  126.  
  127.             for(int var7 = 1; var7 < var6.length; ++var7) {
  128.                var6[var7] = var3[var7 - 1];
  129.             }
  130.  
  131.             try {
  132.                var11 = ((GlobalContext)this).lookupConstructor(var2, var6);
  133.             } catch (Exception var8) {
  134.                throw new CatchedExceptionError(var10, var1);
  135.             }
  136.  
  137.             var1.setProperty("outerInnerAllocation", (Object)null);
  138.          }
  139.       }
  140.  
  141.       var1.setProperty("type", var2);
  142.       var1.setProperty("constructor", var11);
  143.       return var2;
  144.    }
  145.  
  146.    public Object invokeConstructor(SimpleAllocation var1, Object[] var2) {
  147.       Constructor var3 = (Constructor)var1.getProperty("constructor");
  148.       if (var1.hasProperty("innerAllocation")) {
  149.          Object[] var4 = new Object[var2.length + 1];
  150.          var4[0] = this.getHiddenArgument();
  151.  
  152.          for(int var5 = 1; var5 < var4.length; ++var5) {
  153.             var4[var5] = var2[var5 - 1];
  154.          }
  155.  
  156.          var2 = var4;
  157.       } else if (var1.hasProperty("outerInnerAllocation")) {
  158.          Object[] var11 = new Object[var2.length + 1];
  159.          Field[] var12 = this.declaringClass.getDeclaredFields();
  160.  
  161.          for(int var6 = 0; var6 < var12.length; ++var6) {
  162.             if (var12[var6].getName().startsWith("this$")) {
  163.                try {
  164.                   var12[var6].setAccessible(true);
  165.                   var11[0] = var12[var6].get(this.getHiddenArgument());
  166.                   break;
  167.                } catch (IllegalAccessException var8) {
  168.                   throw new CatchedExceptionError(var8, var1);
  169.                }
  170.             }
  171.          }
  172.  
  173.          for(int var13 = 1; var13 < var11.length; ++var13) {
  174.             var11[var13] = var2[var13 - 1];
  175.          }
  176.  
  177.          var2 = var11;
  178.       }
  179.  
  180.       try {
  181.          return var3.newInstance(var2);
  182.       } catch (InvocationTargetException var9) {
  183.          if (var9.getTargetException() instanceof Error) {
  184.             throw (Error)var9.getTargetException();
  185.          } else {
  186.             throw new ThrownException(var9.getTargetException());
  187.          }
  188.       } catch (Exception var10) {
  189.          throw new CatchedExceptionError(var10, var1);
  190.       }
  191.    }
  192.  
  193.    public Class setProperties(ClassAllocation var1, Class var2, Class[] var3, List var4) {
  194.       String var5 = this.declaringClass.getName();
  195.       String var6 = var5 + "$" + classCount++;
  196.       ReferenceType var9 = new ReferenceType(var5);
  197.       FieldDeclaration var7 = new FieldDeclaration(25, CLASS_TYPE, "declaring$Class$Reference$0", new TypeExpression(var9));
  198.       var4.add(var7);
  199.       var7 = new FieldDeclaration(1, var9, "this$0", (Expression)null);
  200.       var4.add(var7);
  201.       var4.add(LOCALS);
  202.       var7 = new FieldDeclaration(25, OBJECT_ARRAY_ARRAY, "local$Variables$Class$0", ((GlobalContext)this).createClassArrayInitializer());
  203.       var4.add(var7);
  204.       LinkedList var10 = new LinkedList();
  205.       LinkedList var11 = new LinkedList();
  206.       var10.add(new FormalParameter(false, var9, "param$0"));
  207.       var10.add(new FormalParameter(false, MAP_TYPE, "param$1"));
  208.       LinkedList var12 = new LinkedList();
  209.  
  210.       for(int var13 = 0; var13 < var3.length; ++var13) {
  211.          var10.add(new FormalParameter(false, TreeUtilities.classToType(var3[var13]), "param$" + (var13 + 2)));
  212.          LinkedList var14 = new LinkedList();
  213.          var14.add(new Identifier("param$" + (var13 + 2)));
  214.          var12.add(new QualifiedName(var14));
  215.       }
  216.  
  217.       ConstructorInvocation var26 = null;
  218.       if (var12.size() > 0) {
  219.          var26 = new ConstructorInvocation((Expression)null, var12, true);
  220.       }
  221.  
  222.       LinkedList var27 = new LinkedList();
  223.       var27.add(new Identifier("this$0"));
  224.       LinkedList var15 = new LinkedList();
  225.       var15.add(new Identifier("param$0"));
  226.       var11.add(new SimpleAssignExpression(new QualifiedName(var27), new QualifiedName(var15)));
  227.       var27 = new LinkedList();
  228.       var27.add(new Identifier("local$Variables$Reference$0"));
  229.       var15 = new LinkedList();
  230.       var15.add(new Identifier("param$1"));
  231.       var11.add(new SimpleAssignExpression(new QualifiedName(var27), new QualifiedName(var15)));
  232.       ConstructorDeclaration var8 = new ConstructorDeclaration(1, var6, var10, new LinkedList(), var26, var11);
  233.       var4.add(var8);
  234.       LinkedList var16 = null;
  235.       LinkedList var17 = null;
  236.       if (var2.isInterface()) {
  237.          var17 = new LinkedList();
  238.          LinkedList var18 = new LinkedList();
  239.          var18.add(new Identifier(var2.getName()));
  240.          var17.add(var18);
  241.       } else {
  242.          var16 = new LinkedList();
  243.          var16.add(new Identifier(var2.getName()));
  244.       }
  245.  
  246.       ClassDeclaration var30 = new ClassDeclaration(1, var6, var16, var17, var4);
  247.       ((TypeDeclaration)var30).setProperty("anonymousDeclaringClass", new JavaClassInfo(this.declaringClass));
  248.       Class var19 = (new TreeCompiler(this.interpreter)).compileTree(this, var30);
  249.       Class[] var20 = new Class[var3.length + 2];
  250.       var20[0] = this.declaringClass;
  251.       var20[1] = class$Ljava$util$Map != null ? class$Ljava$util$Map : (class$Ljava$util$Map = class$("java.util.Map"));
  252.  
  253.       for(int var21 = 2; var21 < var20.length; ++var21) {
  254.          var20[var21] = var3[var21 - 2];
  255.       }
  256.  
  257.       var3 = var20;
  258.  
  259.       try {
  260.          var1.setProperty("constructor", ((GlobalContext)this).lookupConstructor(var19, var3));
  261.       } catch (NoSuchMethodException var22) {
  262.          var22.printStackTrace();
  263.       }
  264.  
  265.       var1.setProperty("type", var19);
  266.       return var19;
  267.    }
  268.  
  269.    public Object invokeConstructor(ClassAllocation var1, Object[] var2) {
  270.       Constructor var3 = (Constructor)var1.getProperty("constructor");
  271.       Object[] var4 = new Object[var2.length + 2];
  272.       var4[0] = this.getHiddenArgument();
  273.       var4[1] = ((VariableContext)this).getConstants();
  274.  
  275.       for(int var5 = 2; var5 < var4.length; ++var5) {
  276.          var4[var5] = var2[var5 - 2];
  277.       }
  278.  
  279.       var2 = var4;
  280.  
  281.       try {
  282.          return var3.newInstance(var2);
  283.       } catch (InvocationTargetException var6) {
  284.          if (var6.getTargetException() instanceof Error) {
  285.             throw (Error)var6.getTargetException();
  286.          } else {
  287.             throw new ThrownException(var6.getTargetException());
  288.          }
  289.       } catch (Exception var7) {
  290.          throw new CatchedExceptionError(var7, var1);
  291.       }
  292.    }
  293.  
  294.    public Method lookupMethod(Node var1, String var2, Class[] var3) throws NoSuchMethodException {
  295.       Class var4 = NodeProperties.getType(var1);
  296.       Object var5 = null;
  297.  
  298.       try {
  299.          Method var12 = ReflectionUtilities.lookupMethod(var4, var2, var3);
  300.          ((StaticContext)this).setAccessFlag(var12);
  301.          if (var12.getName().equals("clone")) {
  302.             var12.setAccessible(true);
  303.          }
  304.  
  305.          return var12;
  306.       } catch (NoSuchMethodException var10) {
  307.          if (var1 instanceof QualifiedName && ((QualifiedName)var1).getRepresentation().equals("this")) {
  308.             Method var11 = InterpreterUtilities.lookupOuterMethod(var4, var2, var3);
  309.             Object var7 = (Expression)this.defaultQualifier;
  310.  
  311.             for(Class var8 = this.declaringClass; var8 != var11.getDeclaringClass(); var8 = InterpreterUtilities.getDeclaringClass(var8)) {
  312.                String var9 = this.getOuterThisName(var8);
  313.                if (var9 == null) {
  314.                   break;
  315.                }
  316.  
  317.                var7 = new ObjectFieldAccess((Expression)var7, this.getOuterThisName(var8));
  318.             }
  319.  
  320.             var11.setAccessible(true);
  321.             throw new MethodModificationError((Expression)var7, var11);
  322.          } else {
  323.             throw var10;
  324.          }
  325.       }
  326.    }
  327.  
  328.    protected boolean isInnerclass(Class var1, Class var2) {
  329.       do {
  330.          Class[] var3 = var2.getDeclaredClasses();
  331.  
  332.          for(int var4 = 0; var4 < var3.length; ++var4) {
  333.             if (var3[var4] == var1) {
  334.                return true;
  335.             }
  336.          }
  337.       } while((var2 = var2.getSuperclass()) != null);
  338.  
  339.       return false;
  340.    }
  341.  
  342.    protected String getOuterThisName(Class var1) {
  343.       Field[] var2 = var1.getDeclaredFields();
  344.  
  345.       for(int var3 = 0; var3 < var2.length; ++var3) {
  346.          if (var2[var3].getName().startsWith("this$")) {
  347.             return var2[var3].getName();
  348.          }
  349.       }
  350.  
  351.       return null;
  352.    }
  353.  
  354.    // $FF: synthetic method
  355.    static Class class$(String var0) {
  356.       try {
  357.          return Class.forName(var0);
  358.       } catch (ClassNotFoundException var2) {
  359.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  360.       }
  361.    }
  362.  
  363.    public MethodContext(Interpreter var1, Class var2, Object var3, ImportationManager var4) {
  364.       super(var1, var2, var4);
  365.       this.importationManager = var4;
  366.       LinkedList var5 = new LinkedList();
  367.       var5.add(thisIdentifier);
  368.       this.defaultQualifier = new QualifiedName(var5);
  369.       ((VariableContext)this).setConstant("this", var3);
  370.    }
  371.  
  372.    public MethodContext(Interpreter var1, Class var2, Object var3, Set var4) {
  373.       super(var1, var2, var4);
  374.       LinkedList var5 = new LinkedList();
  375.       var5.add(thisIdentifier);
  376.       this.defaultQualifier = new QualifiedName(var5);
  377.       ((VariableContext)this).setConstant("this", var3);
  378.    }
  379. }
  380.